From 343e4992d1ab8c46dd5a6678f9d58c1b1884c2fc Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 13 Sep 2005 10:12:40 +0000 Subject: [PATCH] domain_crash_synchronous() on x86_64 causes Xen to crash because it tries to dereference an invalid stack address. The patch below fixes this. The patch also updates show_registers() to print the same information as its x86_32 equivalent. Signed-off-by: Leendert van Doorn Signed-off-by: Keir Fraser --- xen/arch/x86/traps.c | 4 ++-- xen/arch/x86/x86_64/traps.c | 48 ++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 4f5be98865..e0f00d3920 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -106,7 +106,7 @@ integer_param("debug_stack_lines", debug_stack_lines); #define ESP_BEFORE_EXCEPTION(regs) ((unsigned long *)®s->esp) #else #define stack_words_per_line 4 -#define ESP_BEFORE_EXCEPTION(regs) ((unsigned long *)regs->esp) +#define ESP_BEFORE_EXCEPTION(regs) ((unsigned long *)regs->rsp) #endif int is_kernel_text(unsigned long addr) @@ -238,7 +238,7 @@ void show_stack(struct cpu_user_regs *regs) unsigned long *stack = ESP_BEFORE_EXCEPTION(regs), addr; int i; - if ( GUEST_MODE(regs) ) + if ( GUEST_CONTEXT(current, regs) ) return show_guest_stack(regs); printk("Xen stack trace from "__OP"sp=%p:\n ", stack); diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 7fee601699..4f7c822ef8 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -12,25 +12,51 @@ #include #include #include +#include void show_registers(struct cpu_user_regs *regs) { - printk("CPU: %d\nRIP: %04x:[<%016lx>]", - smp_processor_id(), 0xffff & regs->cs, regs->rip); + unsigned long rip, rsp, rflags, cs, cr0, cr3; + const char *context; + + if ( VMX_DOMAIN(current) && (regs->eflags == 0) ) + { + __vmread(GUEST_RIP, &rip); + __vmread(GUEST_RSP, &rsp); + __vmread(GUEST_RFLAGS, &rflags); + __vmread(GUEST_CS_SELECTOR, &cs); + __vmread(CR0_READ_SHADOW, &cr0); + __vmread(GUEST_CR3, &cr3); + context = "vmx guest"; + } + else + { + rip = regs->rip; + rflags = regs->rflags; + cr0 = read_cr0(); + cr3 = read_cr3(); + rsp = regs->rsp; + cs = regs->cs & 0xffff; + context = GUEST_MODE(regs) ? "guest" : "hypervisor"; + } + + printk("CPU: %d\nRIP: %04lx:[<%016lx>]", + smp_processor_id(), cs, rip); if ( !GUEST_MODE(regs) ) - print_symbol(" %s", regs->rip); - printk("\nRFLAGS: %016lx\n", regs->eflags); + print_symbol(" %s", rip); + printk("\nRFLAGS: %016lx CONTEXT: %s\n", rflags, context); printk("rax: %016lx rbx: %016lx rcx: %016lx\n", regs->rax, regs->rbx, regs->rcx); printk("rdx: %016lx rsi: %016lx rdi: %016lx\n", regs->rdx, regs->rsi, regs->rdi); printk("rbp: %016lx rsp: %016lx r8: %016lx\n", - regs->rbp, regs->rsp, regs->r8); + regs->rbp, rsp, regs->r8); printk("r9: %016lx r10: %016lx r11: %016lx\n", regs->r9, regs->r10, regs->r11); printk("r12: %016lx r13: %016lx r14: %016lx\n", regs->r12, regs->r13, regs->r14); - printk("r15: %016lx\n", regs->r15); + printk("r15: %016lx cr0: %016lx cr3: %016lx\n", + regs->r15, cr0, cr3); show_stack(regs); } @@ -194,3 +220,13 @@ long do_set_callbacks(unsigned long event_address, return 0; } + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 2.30.2